home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / asmutil / 68kdis.zip / PRIN.C < prev    next >
C/C++ Source or Header  |  1988-12-03  |  6KB  |  335 lines

  1. /*
  2.  *    SCCS:    @(#)prin.c    1.2    11/2/84    14:19:47
  3.  *    Print stuff.
  4.  *
  5.  ***********************************************************************
  6.  *    This software is copyright of
  7.  *
  8.  *        John M Collins
  9.  *        47 Cedarwood Drive
  10.  *        St Albans
  11.  *        Herts, AL4 0DN
  12.  *        England            +44 727 57267
  13.  *
  14.  *    and is released into the public domain on the following conditions:
  15.  *
  16.  *        1.  No free maintenance will be guaranteed.
  17.  *        2.  Nothing may be based on this software without
  18.  *            acknowledgement, including incorporation of this
  19.  *            notice.
  20.  *
  21.  *    Notwithstanding the above, the author welcomes correspondence and bug
  22.  *    fixes.
  23.  ***********************************************************************
  24.  */
  25.  
  26. #include <stdio.h>
  27. #include <a.out.h>
  28. #include <ldfcn.h>
  29. #include "unc.h"
  30.  
  31. #define    LINELNG    70
  32.  
  33. void    gette(), getde();
  34. long    gettw(), getdw();
  35. void    prinst();
  36.  
  37. char    noabs;            /*  No non-global absolutes  */
  38. int    rel;            /*  File being analysed is relocatable  */
  39. int    lpos;
  40.  
  41. struct    commit    abstab, comtab;
  42. extern char shlibout;
  43.  
  44. /*
  45.  *    Print absolute and common values.
  46.  */
  47.  
  48. void    pabs()
  49. {
  50.     register  int    i;
  51.     register  symbol  cs;
  52.  
  53.     for  (i = 0;  i < abstab.c_int;  i++)
  54.     
  55.     for  (i = 0;  i < abstab.c_int;  i++)  {
  56.         cs = abstab.c_symb[i];
  57.         if (cs->s_value >= 0x300000 && ! shlibout)
  58.             continue;
  59.         if  (cs->s_glob)
  60.             (void) printf("#\tglobal\t%s\n", cs->s_name);
  61.         else  if  (noabs)
  62.             continue;
  63.         (void) printf("# %s\t= 0x%lx\n", cs->s_name, cs->s_value);
  64.     }
  65.     for  (i = 0;  i < comtab.c_int;  i++)  {
  66.         cs = comtab.c_symb[i];
  67.         (void) printf("\tcomm\t%s,%d\n", cs->s_name, cs->s_value);
  68.     }
  69. }
  70.  
  71. /*
  72.  *    Print out labels.
  73.  */
  74.  
  75. void    plabs(ls, seg)
  76. register  symbol  ls;
  77. int    seg;
  78. {
  79.     for  (; ls != NULL;  ls = ls->s_link)  {
  80.         if  (ls->s_type != seg)
  81.             continue;
  82.         if  (ls->s_lsymb)  {
  83.             (void) printf("L%%%u:\n", ls->s_lsymb);
  84.             return;        /*  Set last  */
  85.         }
  86.         if  (ls->s_glob)
  87.             (void) printf("\n\tglobal\t%s", ls->s_name);
  88.         if (ls->s_name[0] == '.')
  89.             (void) printf("\n# %s:\n", ls->s_name);
  90.         else
  91.             (void) printf("\n%s:\n", ls->s_name);
  92.     }
  93. }
  94.  
  95. /*
  96.  *    Print out text.
  97.  */
  98.  
  99. void    ptext(fid)
  100. register  ef_fid  fid;
  101. {
  102.     register  long    tpos, endt;
  103.     t_entry    tstr;
  104.  
  105.     (void) fputs("\ttext\n", stdout);
  106.     
  107.     tpos = fid->ef_tbase;
  108.     endt = tpos + fid->ef_tsize;
  109. contin:    
  110.     for  (;  tpos < endt;  tpos += tstr.t_lng * 2)  {
  111.         gette(fid, tpos, &tstr);
  112.         plabs(tstr.t_lab, S_TEXT);
  113.         if  (tstr.t_type == T_BEGIN)
  114.             prinst(&tstr, tpos);
  115.         else  if  (tstr.t_relsymb != NULL)  {
  116.             (void) printf("\tlong\t%s", tstr.t_relsymb->s_name);
  117.             if  (tstr.t_relsymb->s_type!=S_TEXT &&
  118.                 tstr.t_relsymb->s_type!=S_DATA)
  119.                 (void) printf("+0x%x", gettw(fid, tpos, R_LONG));
  120.             (void) putchar('\n');
  121.             tpos += 4;
  122.             goto  contin;
  123.         }
  124.         else
  125.             (void) printf("\tshort\t0x%x\n", tstr.t_contents);
  126.     }
  127.  
  128.     /*
  129.      *    Print out any trailing label.
  130.      */
  131.     
  132.     gette(fid, tpos, &tstr);
  133.     plabs(tstr.t_lab, S_TEXT);
  134. }
  135.  
  136. /*
  137.  *    Print out data.
  138.  */
  139.  
  140. void    pdata(fid)
  141. register  ef_fid  fid;
  142. {
  143.     register  long    dpos, endd;
  144.     register  int    lng, ccnt;
  145.     unsigned  ctyp;
  146.     int    had, par, inc;
  147.     char    *msg;
  148.     d_entry    dstr;
  149.     
  150.     (void) fputs("\n\tdata\n", stdout);
  151.     
  152.     dpos = fid->ef_dbase;
  153.     endd = dpos + fid->ef_dsize;
  154.  
  155.     while  (dpos < endd)  {
  156.         
  157.         getde(fid, dpos, &dstr);
  158.         plabs(dstr.d_lab, S_DATA);
  159.             
  160.         switch  (dstr.d_type)  {
  161.         case  D_CONT:
  162.             (void) fprintf(stderr, "Data sync error\n");
  163.             dpos++;
  164.             break;
  165.             
  166.         case  D_ASC:
  167.         case  D_ASCZ:
  168.             ctyp = dstr.d_type;
  169.             lng = dstr.d_lng;
  170.         nextline:
  171.             (void) fputs("\tbyte\t", stdout);
  172.             ccnt=0;
  173.             while  (lng > 0)  {
  174.                 if (ccnt) (void) putchar(',');
  175.                 getde(fid, dpos, &dstr);
  176.                 switch  (dstr.d_contents)  {
  177.                 default:
  178.                     if  (dstr.d_contents < ' ' ||
  179.                         dstr.d_contents > '~')
  180.                         ccnt += printf("0x%x", dstr.d_contents);
  181.                     else {
  182.                         (void) putchar('\'');
  183.                         (void)putchar(dstr.d_contents);
  184.                         ccnt += 2;
  185.                     }
  186.                     break;
  187.                 case  '\\':
  188.                     (void) putchar('\'');
  189.                     (void) putchar('\\');
  190.                     (void) putchar('\\');
  191.                     ccnt+=2;
  192.                     break;
  193.                 case  '\b':
  194.                     (void) putchar('\'');
  195.                     (void) putchar('\\');
  196.                     (void) putchar('b');
  197.                     ccnt+=2;
  198.                     break;
  199.                 case  '\n':
  200.                     (void) putchar('\'');
  201.                     (void) putchar('\\');
  202.                     (void) putchar('n');
  203.                     ccnt+=2;
  204.                     break;
  205.                 case  '\r':
  206.                     (void) putchar('\'');
  207.                     (void) putchar('\\');
  208.                     (void) putchar('r');
  209.                     ccnt+=2;
  210.                     break;
  211.                 case  '\f':
  212.                     (void) putchar('\'');
  213.                     (void) putchar('\\');
  214.                     (void) putchar('f');
  215.                     ccnt+=2;
  216.                     break;
  217.                 case  '\t':
  218.                     (void) putchar('\'');
  219.                     (void) putchar('\\');
  220.                     (void) putchar('t');
  221.                     ccnt+=2;
  222.                     break;
  223.                 }
  224.  
  225.                 lng--;
  226.                 dpos++;
  227.                 if (++ccnt > 40 && lng > 0) {
  228.                     (void) putchar('\n');
  229.                     goto nextline;
  230.                 }
  231.             }
  232.             (void) putchar('\n');
  233.             break;
  234.  
  235.         case  D_BYTE:
  236.             msg = "byte";
  237.             par = R_BYTE;
  238.             inc = 1;
  239.             goto  wrest;
  240.             
  241.         case  D_WORD:
  242.             msg = "short";
  243.             par = R_WORD;
  244.             inc = 2;
  245.             goto  wrest;
  246.             
  247.         case  D_LONG:
  248.             msg = "long";
  249.             par = R_LONG;
  250.             inc = 4;
  251.         wrest:
  252.             (void) putchar('\t');
  253.             (void) fputs(msg, stdout);
  254.             (void) putchar('\t');
  255.             lng = dstr.d_lng;
  256.             lpos = 16;
  257.             had = 0;
  258.             while  (lng > 0)  {
  259.                 if  (lpos > LINELNG) {
  260.                     (void) putchar('\n');
  261.                     (void) putchar('\t');
  262.                     (void) fputs(msg, stdout);
  263.                     (void) putchar('\t');
  264.                     lpos = 16;
  265.                 }
  266.                 else  if  (had) {
  267.                     (void) putchar(',');
  268.                     (void) putchar(' ');
  269.                     lpos += 2;
  270.                 }
  271.                 lpos += printf("0x%x", getdw(fid, dpos, par));
  272.                 lng -= inc;
  273.                 dpos += inc;
  274.                 had++;
  275.             }
  276.             (void) putchar('\n');
  277.             break;
  278.  
  279.         case  D_ADDR:
  280.             (void) fputs("\tlong\t", stdout);
  281.             lng = dstr.d_lng;
  282.             lpos = 16;
  283.             had = 0;
  284.             while  (lng > 0)  {
  285.                 if  (lpos > LINELNG)  {
  286.                     (void) fputs("\n\tlong\t", stdout);
  287.                     lpos = 16;
  288.                 }
  289.                 else  if  (had) {
  290.                     (void) putchar(',');
  291.                     (void) putchar(' ');
  292.                     lpos += 2;
  293.                 }
  294.  
  295.                 getde(fid, dpos, &dstr);
  296.                 lpos += printf("%s", dstr.d_relsymb->s_name);
  297.                 lng -= sizeof(long);
  298.                 dpos += sizeof(long);
  299.                 had++;
  300.             }
  301.             (void) putchar('\n');
  302.             break;
  303.         }
  304.     }
  305.     
  306.     /*
  307.      *    Print trailing label.
  308.      */
  309.     
  310.     getde(fid, dpos, &dstr);
  311.     plabs(dstr.d_lab, S_DATA);
  312. }
  313.  
  314. void    pbss(fid)
  315. register  ef_fid  fid;
  316. {
  317.     register  long    bpos = fid->ef_bbase;
  318.     long    endb = fid->ef_end;
  319.     d_entry    bstr;
  320.     
  321.     (void) fputs("\n# .bss\n", stdout);
  322.     
  323.     while  (bpos < endb)  {
  324.         getde(fid, bpos, &bstr);
  325.         plabs(bstr.d_lab, S_BSS);
  326.         (void) printf("\tspace\t%d\n", bstr.d_lng);
  327.         bpos += bstr.d_lng;
  328.     }
  329.     
  330.     getde(fid, endb, &bstr);
  331.     plabs(bstr.d_lab, S_BSS);
  332. }
  333.  
  334.  
  335.